﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Administration.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Exceptions;

namespace HerGoS.Administration.Engine
{
    public class GestorEntidades
    {
        public static Entidad Obtener(int OID)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "ENTIDADES_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", OID);
                DataTable dt = repo.ExecuteDataTable();
                Entidad result = dt.ToGenericList<Entidad>(EntidadConverter).FirstOrDefault();
                return result;
            }
            catch (Exception ex)
            {
                throw new EntidadesGetException(ex);
            }
        }


        public static void Guardar(Entidad entidad)
        {
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryName);
                repo.Nombre = "ENTIDADES_PROC";
                repo.AddParameter("@ACCION ",entidad.Persistencia);
                repo.AddParameter("@ID", entidad.OID);
                repo.AddParameter("@DENOMINACION", entidad.Denominacion);
                repo.AddParameter("@INTERNA",entidad.Interna);
                repo.AddParameter("@IDENTIDADSUPERIOR", entidad.Superior);
                repo.AddParameter("@IDJURISDICCION", entidad.Jurisdiccion == null ? null: (int?) entidad.Jurisdiccion.OID);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                entidad.OID = repo.ExecuteReturnValue().ToInteger();
                repo.Commit();                

                GestorDomicilio.Guardar(entidad);

                GestorContacto.Guardar(entidad);

                GestorBitacora.Guardar(entidad);

       
            }
            catch (Exception ex)
            {
                throw new EntidadesSaveException(ex);
            }
        }

        public static void Eliminar(Entidad entidad)
        {
            entidad.Persistencia = EstadoPersistencia.DELETE;
            Guardar(entidad);
            entidad.Persistencia = EstadoPersistencia.UPDATE;
            entidad.Activo = false;
        }
        public static void ReActivar(Entidad entidad)
        {
            entidad.Persistencia = EstadoPersistencia.UNDELETE;
            Guardar(entidad);
            entidad.Persistencia = EstadoPersistencia.UPDATE;
            entidad.Activo = true;
        }

        public static List<Entidad> Consultar(string denominacion, bool? interna, int? idEntidadSuperior , int? idJuridiccion,bool? activo)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "ENTIDADES_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@DENOMINACION", denominacion);
                repo.AddParameter("@INTERNA", interna);
                repo.AddParameter("@IDENTIDADSUPERIOR", idEntidadSuperior);
                repo.AddParameter("@IDJURISDICCION", idJuridiccion);
                repo.AddParameter("@ACTIVO", activo);
                DataTable dt = repo.ExecuteDataTable();
                List<Entidad> result = dt.ToGenericList<Entidad>(EntidadConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new EntidadesGetException(ex);
            }
        }

        public static List<Entidad> Consultar()
        {
            return Consultar(null,null, null,null,null);
        }

        public static List<Entidad> Consultar(string denominacion, bool? interna, int? idEntidadSuperior, int? idJuridiccion)
        {
            return Consultar(denominacion,interna,idEntidadSuperior,idJuridiccion, true);
        }

        public static List<Entidad> Consultar(bool activo)
        {
            return Consultar(null, null,null,null, activo);
        }

        public static Entidad Consultar(string denominacion)
        {
            return Consultar(denominacion, null, null, null, true).FirstOrDefault();
        }
        

        #region Converter

        public static Entidad EntidadConverter(DataRow row)
        {
            Entidad entidad  =  new Entidad
            {
                OID = row["entID"].ToInteger(),
                Denominacion= row["entDENOMINACION"].ToString(),
                Interna = row["entINTERNA"].ToBoolean(),
                Superior = row["entIDENTIDADSUPERIOR"].ToInteger(),
                DenominacionEntidadSuperior = row["EntidadSuperior"].ToString(),
                Jurisdiccion = GestorJurisdicciones.Obtener(row["entIDJURISDICCION"].ToInteger()),
                Persistencia = EstadoPersistencia.UPDATE,

                Activo = row.IsNull("FECHA_BAJA") ? true : false
            };

           entidad.Domicilios = GestorDomicilio.Consultar(entidad);
           entidad.Contactos = GestorContacto.Consultar(entidad);
             return entidad;
        }
        #endregion


    }
}
